admin的网址和登陆密码
- 域名:端口号/admin/
- 账号和密码一般都是你所创建的超级用户
http://127.0.0.1:8001/admin/
admin的相关配置
1. 让admin读取你所创建的表
- 语法: admin.site.register(表的类)
# app01/admin.py
from django.contrib import admin
from .models import *
admin.site.register(UserInfo)
admin.site.register(Article)
admin.site.register(Blog)
2. 使用中文显示admin网站
- 将配置文件中的 LANGUAGE_CODE 设置为 zh-hans
# settings.py
LANGUAGE_CODE = 'zh-hans'
3. 使用中文显示表名
- 在表的类中配置元信息
# models.py
class UserInfo(AbstractUser):
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True, blank=True)
def __str__(self):
return self.username
class Meta:
verbose_name = "用户信息表"
verbose_name_plural = verbose_name
4. 使用中文显示字段名
- verbose_name='字段名'
# models.py
class Blog(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, verbose_name='个人博客标题')
site = models.CharField(max_length=32, unique=True, verbose_name='个人博客后缀')
theme = models.CharField(max_length=32, verbose_name='博客主题')
def __str__(self):
return self.title
class Meta:
verbose_name = "博客信息表"
verbose_name_plural = verbose_name
5. 允许该字段在 admin 为空
- 有时候使用admin添加数据的时候,就算表的类设置该字段为空,但是admin还是会提醒该字段必填
- blank=True
class ArticleUpDown(models.Model):
nid = models.AutoField(primary_key=True)
user = models.ForeignKey('UserInfo', null=True, verbose_name='作者id', blank=True)
article = models.ForeignKey("Article", null=True, verbose_name='文章id', blank=True)
is_up = models.BooleanField(default=True, verbose_name='是否点赞了')
class Meta:
verbose_name = "点赞表"
verbose_name_plural = verbose_name
unique_together = [
('article', 'user'),
]
6. 如果在 admin 表中显示 xxx object 那么就是没有使用 __str__
# models.py
class Blog(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, verbose_name='个人博客标题')
site = models.CharField(max_length=32, unique=True, verbose_name='个人博客后缀')
theme = models.CharField(max_length=32, verbose_name='博客主题')
def __str__(self):
return self.title
class Meta:
verbose_name = "博客信息表"
verbose_name_plural = verbose_name
admin的相关定制
1.让admin读取你所创建的表
- 语法: admin.site.register(表的类)
# app01/admin.py
from django.contrib import admin
from .models import *
admin.site.register(UserInfo)
admin.site.register(Article)
admin.site.register(Blog)
2. 对单独的表进行配置的写法
- 写法一
from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
admin.site.register(Book, BookAdmin)
class PublisherAdmin(admin.ModelAdmin):
list_display = ['name', 'city']
admin.site.register(Publisher, PublisherAdmin)
- 写法二
from django.contrib import admin
from .models import *
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
@admin.register(Publisher)
class PublisherAdmin(admin.ModelAdmin):
list_display = ['name', 'city']
3. 相关的参数
- list_display -> 在数据列表里,显示该表的某几个字段

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
admin.site.register(Book, BookAdmin)
- .short_description -> 给函数方法添加描述
- 显示多对多字段的数据 和 action 中有相关用法
- 显示多对多字段的数据
- admin 无法直接显示多对多字段中的数据

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'price', 'show_author']
def show_author(self, obj):
author_list = []
for role in obj.author.all():
author_list.append(role.name)
return ','.join(author_list)
show_author.short_description = '作者' # 修改显示的字段名称
admin.site.register(Book, BookAdmin)
- list_display_links -> 在数据列表里,指定该表的某几个字段可以进行跳转(即: 点击该字段跳转到编辑页面)

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
list_display_links = ['title', 'publish_date', 'price', 'memo', 'publisher']
admin.site.register(Book, BookAdmin)
- list_filter -> 在数据列表里,定制右侧快速筛选功能

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
list_filter = ['price', 'memo', 'publisher'] # 如果 publisher 外键字段所关联的表中只有一条数据的话,那么它是不会显示的
admin.site.register(Book, BookAdmin)
- list_select_related -> 连表查询是否自动select_related
from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_select_related = True
admin.site.register(Book, BookAdmin)
- list_editable -> 在数据列表里,指定列表中可以编辑的列
- list_editable 和 list_display_links 是有冲突的,如果 xxx 字段填写在 list_editable 里,那么该字段就不要填写在 list_display_links 里面,反之

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
list_display_links = ['publish_date'] # 必须要指定一个可以进行跳转的字段,因为 admin 默认是使用第一个字段,但是此时第一个字段已经被设置成在列表可编辑了
list_editable = ['title', 'price']
admin.site.register(Book, BookAdmin)
- ordering -> 在数据列表里,指定数据的排序规则

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['id', 'title', 'price']
ordering = ['-id']
admin.site.register(Book, BookAdmin)
- search_fields -> 在数据列表里,指定某几个字段可以使用模糊查询功能

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
search_fields = ['title', 'price']
admin.site.register(Book, BookAdmin)
- date_hierarchy -> 在数据列表里,对Date和DateTime类型进行搜索
- 只接受日期类型的字段名

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
date_hierarchy = 'publish_date' # 只接受日期类型的字段名
admin.site.register(Book, BookAdmin)
- action -> 在数据列表里,自定义action(即: 动作)

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
# 定制Action行为具体方法
def func(self, request, queryset):
'''
:param queryset: 所有被选中的数据
'''
queryset.update(price=100)
func.short_description = "批量初始化价格"
actions = [func, ]
# Action选项都是在页面上方显示
actions_on_top = True
# Action选项都是在页面下方显示
actions_on_bottom = False
# 是否显示选择个数
actions_selection_counter = True
admin.site.register(Book, BookAdmin)
- empty_value_display -> 在数据列表里,如果如果数据为空就显示默认值

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'price', 'memo']
empty_value_display = "列数据为空时,默认显示"
def memo(self, obj):
return obj.memo
memo.empty_value_display = "指定列数据为空时,默认显示"
admin.site.register(Book, BookAdmin)
- raw_id_fields -> 在数据详细页里,将外键字段和多对多字段变成以input框的形式显示

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
raw_id_fields = ['publisher', 'author'] # publisher 是外键字段,author 是多对多字段
admin.site.register(Book, BookAdmin)
- fields -> 在数据详细页里,显示指定的某几个字段,默认全部显示

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
fields = ['title', 'price']
admin.site.register(Book, BookAdmin)
- exclude -> 在数据详细页里,不显示指定的某几个字段

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
exclude = ['publisher', 'author']
admin.site.register(Book, BookAdmin)
- readonly_fields -> 在数据详细页里,指定的某几个字段为只读

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
readonly_fields = ['title']
admin.site.register(Book, BookAdmin)
- fieldsets -> 在数据详细页里,对数据进行分割显示

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
fieldsets = [
['基本数据', {
'fields': ['title', 'price', 'memo', ]
}],
['其他', {
'fields': ['publisher', 'author'],
}],
]
admin.site.register(Book, BookAdmin)
- filter_vertical -> 在数据详细页里,多对多字段显示时,数据移动选择(方向:上下和左右)

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
filter_vertical = ['author'] # 必须传入多对多字段
admin.site.register(Book, BookAdmin)
- radio_fields -> 在数据详细页里,将外键字段以radio的形式显示(默认使用select)

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
radio_fields = {"publisher": admin.VERTICAL} # 或admin.HORIZONTAL
admin.site.register(Book, BookAdmin)
- save_on_top -> 在数据详细页里,在页面上方是否也显示保存删除等按钮

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
save_on_top = True
admin.site.register(Book, BookAdmin)
- save_as -> 在数据详细页里,修改保存按钮的状态
- save_as = True

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
save_as = True
admin.site.register(Book, BookAdmin)
- save_as = False

from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
save_as = False
admin.site.register(Book, BookAdmin)
- save_as_continue -> 在数据详细页里,点击保存并继续编辑
from django.contrib import admin
from .models import *
class BookAdmin(admin.ModelAdmin):
save_as_continue = True
admin.site.register(Book, BookAdmin)
- 定制HTML模板
add_form_template = 'xxx.html'
change_form_template = 'xxx.html'
change_list_template = 'xxx.html'
delete_confirmation_template = 'xxx.html'
delete_selected_confirmation_template = 'xxx.html'
object_history_template = 'xxx.html'
- inlines -> 在数据详细页里,如果有其他表和当前表做外键关联的时候,那么详细页面可以进行动态增加和删除
class UserInfoInline(admin.StackedInline): # TabularInline
extra = 0
model = models.UserInfo
class GroupAdminMode(admin.ModelAdmin):
list_display = ('id', 'title',)
inlines = [UserInfoInline, ]
- form=ModelForm,用于定制用户请求时候表单验证
from app01 import models
from django.forms import ModelForm
from django.forms import fields
class MyForm(ModelForm):
others = fields.CharField()
class Meta:
model = models = models.UserInfo
fields = "__all__"
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
form = MyForm